Windows PowerShell 提供 1 組 cmdlet 來讓我們將執行的結果加以格式化。
在 Windows PowerShell 裡,有 1 組以 Format 帶頭的 cmdlet 可以將執行的結果加以格式化,如此一來,我們便可決定要如何顯示結果。
這組格式化的 cmdlet 有下列幾種:
Format-Wide (別名是 fw)
Format-List(別名是 fl)
Format-Table(別名是 ft)
Format-Custom(別名是 fc)
在此僅討論前 3 種。每種格式化的 cmdlet 都有其預設的屬性,因此我們不需特別指定所要顯示的屬性。而且每種格式化的 cmdlet 也都使用相同的參數:Property,來指定所要顯示的屬性有哪些。
Format-Wide
就先用 Format-Wide 的基本型來查看目前執行中的程序,以 ie 帶頭的有哪些:
Get-Process -Name ie* | Format-Wide
沒指定任何參數,就會顯示 2 欄的結果
接著加入參數:Property 以便指定只看程序的識別碼(亦即 Id 欄位)為何:
Get-Process -Name ie* | Format-Wide -Property Id
看完這兩個執行結果,不知道大家有沒有發現到一件事情,那就是 Format-Wide 一次只能顯示 1 個屬性。因此,當我們希望每 1 行只顯示 1 個結果時,就可以再加入 Column 1 參數:
Get-Process -Name ie* | Format-Wide -Property Id -Column 1
附註:
簡化後的指令:
ps -N ie* | fw -P Id -C 1
再簡化一次:
ps ie* | fw Id -C 1
看出差異沒有?其實不用特別將 Name 與 Property 參數寫出來,Windows PowerShell 的 Get-Process 與 Format-Wide 就會知道要找執行程序名稱是什麼,以及要把哪些欄位的屬性列出來。不過,還是老話一句,不要把指令簡寫的太過火,不然就是要加上相關的註解。
如果您要在每一行顯示多個欄位,卻又不希望每個欄位的字會因為指定過多的欄位個數而被截斷,可以使用 AutoSize 參數,以便讓 Windows PowerShell 自動計算出最佳的欄位個數:
Get-Process | Format-Wide -AutoSize
Format-List
Format-List cmdlet 會將結果的每一個屬性,逐行以清單方式列示出來,所以使用 Format-List 可以顯示結果的全部或部分屬性。直接看例子比較清楚,沒有指定任何參數:
Get-Process ie* | Format-List
使用 Property 參數指定只顯示產品名稱、識別碼、與檔案版本:
Get-Process ie* | Format-List Product, Id, FileVersion
以下面的指令而言,使用萬用字元 *,單單 1 個程序就會列出高達 60 多個屬性結果:
Get-Process ie* | Format-List *
Format-Table
Format-Table cmdlet 會將結果以整齊的表格方式呈現,Windows PowerShell 會自動決定每個欄位所要呈現的內容,當然我們可以自訂要顯示哪些欄位。
不加任何參數:
Get-Process -Name ie* | Format-Table
其實上面指令執行的結果就跟使用 Get-Process 不加任何格式化一樣:
Get-Process -Name ie*
自訂顯示某些欄位:
Get-Process ie* | Format-Table Product, Id, FileVersion, Path, Company
某些欄位的結果出現 ...,就表示有些字元被截斷了,這時候就要 AutoSize 參數上場了:
Get-Process ie* | Format-Table Product, Id, FileVersion, Path, Company -AutoSize
雖然使用了 AutoSize 參數,但在結果中,卻看不到公司的欄位。那把 Product 跟 Company 的位置互換,看看結果如何:
Get-Process ie* | Format-Table Company, Id, FileVersion, Path, Product -AutoSize
從上圖中,我們可以發現,Format-Table 會把距離 Property 參數越近的欄位之重要性視為最高,越後面的欄位之重要性越低,所以 Product 欄位就被壯烈地犧牲掉了,不過 Windows PowerShell 還滿貼心的會提醒我們這件事。
如果不希望犧牲任何欄位,請使用 Wrap 參數:
Get-Process ie* | Format-Table -Wrap Product, Id, FileVersion, Path, Company
使用 Format-Table 的另外一個好處是,搭配 GroupBy 參數可以把某個欄位值相同的排在一起,以方便進行比對:
Get-Process ie* | Format-Table -Wrap Product, Id, FileVersion, Path -AutoSize -GroupBy Path
只要建立擁有 2 個鍵值:Label 與 Expression 的雜湊表(Hash Table)便可進行計算,其中的 Label 鍵值是代表計算後的欄位名稱,而 Expression 鍵值則是一段計算結果的程式碼。以下面的程式碼為例,就是計算出 IE 瀏覽器已經執行多久的時間:
Get-Process iexplore | Format-Table ProcessName, @{Label="已經執行多久時間"; Expression={(get-date) - $_.StartTime}}
有時候,會因為要寫的程式碼過長,所以我們會使用 ****</span> 這個符號來告訴 Windows PowerShell 說,這行的程式碼到這邊為止,新的要從下一行開始: Get-Process iexplore | Format-Table ProcessName,
@{Label="已經執行多久時間"; Expression={(get-date) - $_.StartTime}} `
-AutoSize
為了編輯這篇文章
我足足花了一個多小時
在跟 bbcode 奮戰
因為不管怎麼改
程式碼的內容居然都會自動變成一樣的
最後我投降了
實在是累了
所以有部分的程式碼
就請自行辛苦點
剪下、貼上多操作幾次吧
以前我也發生過同樣的情形,
就是同一篇文章超過了太多組「CODE」段落,
「CODE」段落的程式碼內容就會造成不正常顯示。
所以儘管會有很多的 一行指令,要做說明,
儘量集中在同一個「CODE」的區域,
裡面再用「#」註解符號,放說明內容…
才解決這一網站 太多組「CODE」段落 的問題。